require(__dirname+'/test-helper');

var pguser = process.env['PGUSER'] || process.env.USER;
var pgdatabase = process.env['PGDATABASE'] || process.env.USER;
var pgport = process.env['PGPORT'] || 5432;

test('client settings', function() {

  test('defaults', function() {
    var client = new Client();
    assert.equal(client.user, pguser);
    assert.equal(client.database, pgdatabase);
    assert.equal(client.port, pgport);
    assert.equal(client.ssl, false);
  });

  test('custom', function() {
    var user = 'brian';
    var database = 'pgjstest';
    var password = 'boom';
    var client = new Client({
      user: user,
      database: database,
      port: 321,
      password: password,
      ssl: true
    });

    assert.equal(client.user, user);
    assert.equal(client.database, database);
    assert.equal(client.port, 321);
    assert.equal(client.password, password);
    assert.equal(client.ssl, true);
  });

  test('custom ssl default on', function() {
    var old = process.env.PGSSLMODE;
    process.env.PGSSLMODE = "prefer";

    var client = new Client();
    process.env.PGSSLMODE = old;

    assert.equal(client.ssl, true);
  });

  test('custom ssl force off', function() {
    var old = process.env.PGSSLMODE;
    process.env.PGSSLMODE = "prefer";

    var client = new Client({
      ssl: false
    });
    process.env.PGSSLMODE = old;

    assert.equal(client.ssl, false);
  });

});

test('initializing from a config string', function() {

  test('uses the correct values from the config string', function() {
    var client = new Client("postgres://brian:pass@host1:333/databasename")
    assert.equal(client.user, 'brian');
    assert.equal(client.password, "pass");
    assert.equal(client.host, "host1");
    assert.equal(client.port, 333);
    assert.equal(client.database, "databasename");
  });

  test('uses the correct values from the config string with space in password', function() {
    var client = new Client("postgres://brian:pass word@host1:333/databasename")
    assert.equal(client.user, 'brian');
    assert.equal(client.password, "pass word");
    assert.equal(client.host, "host1");
    assert.equal(client.port, 333);
    assert.equal(client.database, "databasename");
  });

  test('when not including all values the defaults are used', function() {
    var client = new Client("postgres://host1");
    assert.equal(client.user, process.env['PGUSER'] || process.env.USER);
    assert.equal(client.password, process.env['PGPASSWORD'] || null);
    assert.equal(client.host, "host1");
    assert.equal(client.port, process.env['PGPORT'] || 5432);
    assert.equal(client.database, process.env['PGDATABASE'] || process.env.USER);
  });

  test('when not including all values the environment variables are used', function() {
    var envUserDefined = process.env['PGUSER'] !== undefined;
    var envPasswordDefined = process.env['PGPASSWORD'] !== undefined;
    var envDBDefined = process.env['PGDATABASE'] !== undefined;
    var envHostDefined = process.env['PGHOST'] !== undefined;
    var envPortDefined = process.env['PGPORT'] !== undefined;

    var savedEnvUser = process.env['PGUSER'];
    var savedEnvPassword = process.env['PGPASSWORD'];
    var savedEnvDB = process.env['PGDATABASE'];
    var savedEnvHost = process.env['PGHOST'];
    var savedEnvPort = process.env['PGPORT'];

    process.env['PGUSER'] = 'utUser1';
    process.env['PGPASSWORD'] = 'utPass1';
    process.env['PGDATABASE'] = 'utDB1';
    process.env['PGHOST'] = 'utHost1';
    process.env['PGPORT'] = 5464;

    var client = new Client("postgres://host1");
    assert.equal(client.user, process.env['PGUSER']);
    assert.equal(client.password, process.env['PGPASSWORD']);
    assert.equal(client.host, "host1");
    assert.equal(client.port, process.env['PGPORT']);
    assert.equal(client.database, process.env['PGDATABASE']);

    if (envUserDefined) {
      process.env['PGUSER'] = savedEnvUser;
    } else {
      delete process.env['PGUSER'];
    }

    if (envPasswordDefined) {
      process.env['PGPASSWORD'] = savedEnvPassword;
    } else {
      delete process.env['PGPASSWORD'];
    }

    if (envDBDefined) {
      process.env['PGDATABASE'] = savedEnvDB;
    } else {
      delete process.env['PGDATABASE'];
    }

    if (envHostDefined) {
      process.env['PGHOST'] = savedEnvHost;
    } else {
      delete process.env['PGHOST'];
    }

    if (envPortDefined) {
      process.env['PGPORT'] = savedEnvPort;
    } else {
      delete process.env['PGPORT'];
    }
  });
});

test('calls connect correctly on connection', function() {
  var client = new Client("/tmp");
  var usedPort = "";
  var usedHost = "";
  client.connection.connect = function(port, host) {
    usedPort = port;
    usedHost = host;
  };
  client.connect();
  assert.equal(usedPort, "/tmp/.s.PGSQL." + pgport);
  assert.strictEqual(usedHost, undefined);
});

